package imaSyncPull

import (
	"context"
	"fmt"
	"local/config"
	"local/service_manager"
	"time"
	"youdu"
)

var (
	youduOrg youdu.Org
)

// ScheduleService 定义计划任务服务结构
type ScheduleService struct {
	name        string
	description string
	lastError   *service_manager.ServiceError
	tasks       []Task
}

// Task 定义计划任务结构
type Task struct {
	Name     string
	Interval time.Duration
	Execute  func() error
	LastRun  time.Time
}

// NewService 创建新的计划任务服务实例
func NewService() *ScheduleService {
	s := &ScheduleService{
		name:        "ima_sync_pull_service",
		description: "有度插件 - 定时拉取组织架构",
	}

	// 注册示例任务
	s.tasks = []Task{
		// {
		// 	Name:     "每30秒任务",
		// 	Interval: 30 * time.Second,
		// 	Execute: func() error {
		// 		fmt.Printf("[%s] 执行30秒任务\n", time.Now().Format("15:04:05"))
		// 		return nil
		// 	},
		// },
		// {
		// 	Name:     "每分钟任务",
		// 	Interval: time.Minute,
		// 	Execute: func() error {
		// 		fmt.Printf("[%s] 执行每分钟任务\n", time.Now().Format("15:04:05"))
		// 		return nil
		// 	},
		// },
		// {
		// 	Name:     "每5分钟任务",
		// 	Interval: 5 * time.Minute,
		// 	Execute: func() error {
		// 		fmt.Printf("[%s] 执行5分钟任务\n", time.Now().Format("15:04:05"))
		// 		return nil
		// 	},
		// },
		{
			Name:     "定时拉取IMA组织架构",
			Interval: time.Duration(config.Inst.ServiceImaSyncPull.Interval) * time.Minute,
			Execute: func() error {
				// fmt.Printf("[%s] 执行5分钟任务\n", time.Now().Format("15:04:05"))
				// return nil
				return SyncData()
			},
		},
	}

	return s
}

// GetName 获取服务名称
func (s *ScheduleService) GetName() string {
	return s.name
}

// GetDescription 获取服务描述
func (s *ScheduleService) GetDescription() string {
	return s.description
}

// GetDependencies 获取服务依赖
func (s *ScheduleService) GetDependencies() []string {
	return nil
}

// GetLastError 获取最后一次错误
func (s *ScheduleService) GetLastError() *service_manager.ServiceError {
	return s.lastError
}

// OnStart 服务启动前的初始化
func (s *ScheduleService) OnStart(ctx context.Context) error {
	// 配置有度参数
	youduOrg = youdu.Org{
		Server:        config.Inst.Entprise.YouduServer,
		Buin:          config.Inst.Entprise.Buin,
		AppId:         config.Inst.YouduAppOrg.AppId,
		EncodedAesKey: config.Inst.YouduAppOrg.AesKey,
	}
	// 修改定时间隔
	// s.tasks[0].Interval = 1 * time.Minute
	// 打印任务列表
	fmt.Printf("[%s] 计划任务服务启动，已注册 %d 个任务\n",
		time.Now().Format("15:04:05"),
		len(s.tasks))
	return nil
}

// Entry 服务入口函数
func (s *ScheduleService) Entry(ctx context.Context) error {
	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()

	for {
		select {
		case <-ctx.Done():
			return nil
		case now := <-ticker.C:
			// 检查每个任务是否需要执行
			for i := range s.tasks {
				task := &s.tasks[i]
				if now.Sub(task.LastRun) >= task.Interval {
					// 在新的 goroutine 中执行任务
					go func(t *Task) {
						if err := t.Execute(); err != nil {
							s.lastError = &service_manager.ServiceError{
								Time:    time.Now(),
								Message: fmt.Sprintf("任务 %s 执行失败", t.Name),
								Details: err.Error(),
							}
							fmt.Printf("[%s] 任务 %s 执行失败: %v\n",
								time.Now().Format("15:04:05"),
								t.Name,
								err)
						}
					}(task)
					task.LastRun = now
				}
			}
		}
	}
}

// OnStop 服务停止前的清理
func (s *ScheduleService) OnStop(ctx context.Context) error {
	fmt.Printf("[%s] 计划任务服务正在停止...\n",
		time.Now().Format("15:04:05"))
	return nil
}
